#include <board_cfg.h>
#include <irq_s3c24x0.h>
#include <console.h>

void OSTickISR();

void do_irq(void)
{
	S3C24X0_INTERRUPT * irq = S3C24X0_GetBase_INTERRUPT();
	u_int32_t intpnd = irq->INTPND;

	if (intpnd & S3C24X0_INTERRUPT_EINT0) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_EINT0");
		puts("\n");
#endif		
		
		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_EINT0);
	} 
	else if (intpnd & S3C24X0_INTERRUPT_EINT1) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_EINT1");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_EINT1);
	}
	else if (intpnd & S3C24X0_INTERRUPT_EINT2) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_EINT2");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_EINT2);
	}
	else if (intpnd & S3C24X0_INTERRUPT_EINT3) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_EINT3");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_EINT3);
	}
	else if (intpnd & S3C24X0_INTERRUPT_EINT4_7) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_EINT4_7");
		puts("\n");
#endif
		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_EINT4_7);
	}
	else if (intpnd & S3C24X0_INTERRUPT_EINT8_23) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_EINT8_23");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_EINT8_23);
	}
#if defined(CONFIG_S3C2440) || defined(CONFIG_S3C2442)
	else if (intpnd & S3C24X0_INTERRUPT_CAM) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_CAM");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_CAM);
	}
#endif	
	else if (intpnd & S3C24X0_INTERRUPT_BATT_FLT) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_BATT_FLT");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_BATT_FLT);
	}
	else if (intpnd & S3C24X0_INTERRUPT_TICK) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_TICK");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_TICK);
	}
	else if (intpnd & S3C24X0_INTERRUPT_WDT) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_WDT");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_WDT);
	}
	else if (intpnd & S3C24X0_INTERRUPT_TIMER0) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_TIMER0");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_TIMER0);
	}
	else if (intpnd & S3C24X0_INTERRUPT_TIMER1) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_TIMER1");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_TIMER1);
	}
	else if (intpnd & S3C24X0_INTERRUPT_TIMER2) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_TIMER2");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_TIMER2);
	}
	else if (intpnd & S3C24X0_INTERRUPT_TIMER3) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_TIMER3");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_TIMER3);
	}
	else if (intpnd & S3C24X0_INTERRUPT_TIMER4) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_TIMER4");
		puts("\n");
#endif
		OSTickISR();
		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_TIMER4);
	}
	else if (intpnd & S3C24X0_INTERRUPT_UART2) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_UART2");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_UART2);
	}
	else if (intpnd & S3C24X0_INTERRUPT_LCD) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_LCD");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_LCD);
	}
	else if (intpnd & S3C24X0_INTERRUPT_DMA0) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_DMA0");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_DMA0);
	}
	else if (intpnd & S3C24X0_INTERRUPT_DMA1) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_DMA1");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_DMA1);
	}
	else if (intpnd & S3C24X0_INTERRUPT_DMA2) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_DMA2");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_DMA2);
	}
	else if (intpnd & S3C24X0_INTERRUPT_DMA3) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_DMA3");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_DMA3);
	}
	else if (intpnd & S3C24X0_INTERRUPT_SDI) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_SDI");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_SDI);
	}
	else if (intpnd & S3C24X0_INTERRUPT_SPI0) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_SPI0");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_SPI0);
	}
	else if (intpnd & S3C24X0_INTERRUPT_UART1) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_UART1");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_UART1);
	}
#if defined(CONFIG_S3C2440) || defined(CONFIG_S3C2442)
	else if (intpnd & S3C24X0_INTERRUPT_NFCON) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_NFCON");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_NFCON);
	}
#endif	
	else if (intpnd & S3C24X0_INTERRUPT_USBD) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_USBD");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_USBD);
	}
	else if (intpnd & S3C24X0_INTERRUPT_USBH) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_USBH");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_USBH);
	}
	else if (intpnd & S3C24X0_INTERRUPT_IIC) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_IIC");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_IIC);
	}
	else if (intpnd & S3C24X0_INTERRUPT_UART0) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_UART0");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_UART0);
	}
	else if (intpnd & S3C24X0_INTERRUPT_SPI1) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_SPI1");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_SPI1);
	}
	else if (intpnd & S3C24X0_INTERRUPT_RTC) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_RTC");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_RTC);
	}
	else if (intpnd & S3C24X0_INTERRUPT_ADC) {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		printf("S3C24X0_INTERRUPT_ADC");
		puts("\n");
#endif

		/* Clear Pending */
		clear_pending(S3C24X0_INTERRUPT_ADC);
	}
	else {
#if CONFIG_DEBUG_BOARD_INTERRUPT == 1
		puts("ERROR\n");
#endif
		/* 
		 * TODO: reset cpu
		 */
		return;	
	}
}

